package com.winner.data.util;

import java.util.ArrayList;
import java.util.Objects;

import cn.hutool.core.util.ObjectUtil;

/**
 * 今天在用foreach循环的时候有一个逻辑判断需要跳出循环，但是lambda表达式不能用break也不能用continue，
 * 只有return可以用，但是用了之后发现，lambda表达式foreach的return和普通foreach循环的continue效果是一样的
 *
 * Stream.foreach不是一个循环, 它不是为了使用break之类的东西终止而设计的. 如果是并行流, lambda体可以同时在不同的线程上执行(不容易破坏, 很容易产生不正确的结果)
 *
 * @author wangxinle5
 * @since 2022-12-05
 */
public class ForeachReturn {

    public static void main(String[] args) {

        // 数字比较相等 避免空指针异常, 推荐用如下2个
        boolean result1 = Objects.equals(null, 1L);
        System.out.println(result1);

        boolean result2 = ObjectUtil.equals(1, 1L);
        System.out.println(result2);

        ArrayList<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.forEach(a -> {
            System.out.println("第一个循环start");
            if (ObjectUtil.equals(a, 1)) {
                return; // foreach循环,此处作用跳出当前循环,继续下一轮 相当于 for循环continue的作用
            }

            System.out.println("第一个循环 end");
        });

        // 用anyMatch可以直接跳出循环
        list.stream().anyMatch(a -> {
            System.out.println("第二个循环start");
            System.out.println("打印list中的元素" + a);
            if (ObjectUtil.equals(a, 1)) {
                return true; // 返回true的时候可以终止循环
            }
            System.out.println("第二个循环 end");
            return false;
        });


    }

}
